#ifndef PCFEATURE_H
#define PCFEATURE_H

#include "rknn_api.h"
#include "opencv2/core/mat.hpp"
#include <QObject>
#include <QString>
#include <QVariantMap>
#include <QMutex>

class PCFeature : public QObject
{
    Q_OBJECT
public:
    explicit PCFeature(QObject *parent = nullptr);
    ~PCFeature();

    int loadModel(const QString &modelPath, QVariantMap &modelDetail);
    cv::Size modelInputSize = cv::Size(224,224);
    int unloadModel();
    void * detect(cv::Mat &baseImage);

    QString getErrorString() const { return errorString; }  // 获取中文错误信息
    bool canRun;
    rknn_tensor_attr outputAttrs[1];
private:
    // 内部方法
    int queryModelInfo(QVariantMap &modelDetail);
    const char* get_type_string(int type);

    // 成员变量
    rknn_context ctx;
    unsigned char *modelData;


    rknn_tensor_attr inputAttrs[1];
    rknn_tensor_mem *input_mems[1];
    rknn_tensor_mem *output_mems[1];

    cv::Size input_size;
    cv::Size feture_size;
    size_t modelDataSize;

    rknn_sdk_version version;
    QString errorString;

    QMutex mutex;  // 确保线程安全

    QVariantMap modelDetal_;  // 保存模型细节信息
    cv::Mat preprocessImage(const cv::Mat &inputImage);
};

#endif // PCFEATURE_H
